" __  ____   __  _   ___     _____ __  __ ____   ____
"|  \/  \ \ / / | \ | \ \   / /_ _|  \/  |  _ \ / ___|
"| |\/| |\ V /  |  \| |\ \ / / | || |\/| | |_) | |
"| |  | | | |   | |\  | \ V /  | || |  | |  _ <| |___
"|_|  |_| |_|   |_| \_|  \_/  |___|_|  |_|_| \_\\____|


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 通用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let mapleader = " "      " 定义<leader>键
set nocompatible         " 设置不兼容原始vi模式
filetype on              " 设置开启文件类型侦测
filetype plugin on       " 设置加载对应文件类型的插件
set noeb                 " 关闭错误的提示
syntax enable            " 开启语法高亮功能
syntax on                " 自动语法高亮
set t_Co=256             " 开启256色支持
set cmdheight=2          " 设置命令行的高度
set showcmd              " select模式下显示选中的行数
set ruler                " 总是显示光标位置
set laststatus=2         " 总是显示状态栏
set number               " 开启行号显示
set relativenumber       " 开启相对行号
set cursorline           " 高亮显示当前行
set whichwrap+=<,>,h,l   " 设置光标键跨行
set ttimeoutlen=0        " 设置<ESC>键响应时间
set virtualedit=block,onemore   " 允许光标出现在最后一个字符的后面

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码缩进和排版
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set autoindent           " 设置自动缩进
set cindent              " 设置使用C/C++语言的自动缩进方式
set cinoptions=g0,:0,N-s,(0    " 设置C/C++语言的具体缩进方式
set smartindent          " 智能的选择对其方式
filetype indent on       " 自适应不同语言的智能缩进
set expandtab            " 将制表符扩展为空格
set tabstop=4            " 设置编辑时制表符占用空格数
set shiftwidth=4         " 设置格式化时制表符占用空格数
set softtabstop=4        " 设置4个空格为制表符
set smarttab             " 在行和段开始处使用制表符
set nowrap               " 禁止折行
set backspace=2          " 使用回车键正常处理indent,eol,start等
set sidescroll=10        " 设置向右滚动字符数
set nofoldenable         " 禁用折叠代码

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码补全
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set wildmenu             " vim自身命名行模式智能补全
set completeopt-=preview " 补全时不显示窗口，只显示补全列表

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 搜索设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set hlsearch            " 高亮显示搜索结果
set incsearch           " 开启实时搜索功能
set noignorecase          " 搜索时大小写不敏感
set smartcase           " 智能匹配搜索

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 缓存设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set nobackup            " 设置不备份
set noswapfile          " 禁止生成临时文件
set autoread            " 文件在vim之外修改过，自动重新读入
set autowrite           " 设置自动保存
set confirm             " 在处理未保存或只读文件的时候，弹出确认

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 编码设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set langmenu=zh_CN.UTF-8
set helplang=cn
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" gvim/macvim设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("gui_running")
    set guifont=Droid\ Sans\ Mono\ Nerd\ Font\ Complete:h18 " 设置字体
    set guioptions-=m           " 隐藏菜单栏
    set guioptions-=T           " 隐藏工具栏
    set guioptions-=L           " 隐藏左侧滚动条
    set guioptions-=r           " 隐藏右侧滚动条
    set guioptions-=b           " 隐藏底部滚动条
    set showtabline=0           " 隐藏Tab栏
    set guicursor=n-v-c:ver5    " 设置光标为竖线
endif

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 插件列表
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
call plug#begin('~/.config/nvim/plugged')

" Plug 'chxuan/cpp-mode'
" Plug 'chxuan/vim-edit'
" Plug 'chxuan/change-colorscheme'
" Plug 'chxuan/prepare-code'
" Plug 'chxuan/vim-buffer'
" Plug 'chxuan/vimplus-startify'
" Plug 'chxuan/tagbar'
" Plug 'Valloric/YouCompleteMe'
" Plug 'Yggdroot/LeaderF'
" Plug 'mileszs/ack.vim'
" Plug 'easymotion/vim-easymotion'
" Plug 'haya14busa/incsearch.vim'
" Plug 'iamcco/mathjax-support-for-mkdp'
" Plug 'iamcco/markdown-preview.vim'
" Plug 'jiangmiao/auto-pairs'
 Plug 'scrooloose/nerdtree'
" Plug 'tiagofumo/vim-nerdtree-syntax-highlight'
 Plug 'Xuyuanp/nerdtree-git-plugin'
" Plug 'godlygeek/tabular'
" Plug 'tpope/vim-fugitive'
" Plug 'tpope/vim-surround'
" Plug 'tpope/vim-commentary'
" Plug 'tpope/vim-repeat'
" Plug 'tpope/vim-endwise'
" Plug 'octol/vim-cpp-enhanced-highlight'
 Plug 'vim-airline/vim-airline'
 Plug 'vim-airline/vim-airline-themes'
" Plug 'ryanoasis/vim-devicons'
" Plug 'junegunn/vim-slash'
" Plug 'junegunn/gv.vim'
" Plug 'kana/vim-textobj-user'
" Plug 'kana/vim-textobj-indent'
" Plug 'kana/vim-textobj-syntax'
" Plug 'kana/vim-textobj-function'
" Plug 'sgur/vim-textobj-parameter'
" Plug 'Shougo/echodoc.vim'
" Plug 'terryma/vim-smooth-scroll'
" Plug 'rhysd/clever-f.vim'
" Plug 'vim-scripts/indentpython.vim'

call plug#end()            


"     ^
"     u
" < n   o >
"     e
"     v
noremap <silent> n h
noremap <silent> u k
noremap <silent> e j
noremap <silent> o l
noremap <silent> U 5k
noremap <silent> E  5j
noremap <silent> N 0
noremap <silent> O $

" 基本操作键
noremap k u  "后撤A
noremap s <nop>
noremap S :w<CR>
noremap Q :q<CR>
noremap ; :

" 搜索
noremap = nzz
noremap - Nzz
noremap <LEADER><CR> :nohlsearch<CR>

" 重新加载vimrc文件
nnoremap R :source $MYVIMRC<CR>

" 分屏
map so :set splitright<CR>:vsplit<CR>
map sn :set nosplitright<CR>:vsplit<CR>
map su :set nosplitbelow<CR>:split<CR>
map se :set splitbelow<CR>:split<CR>

" 光标分屏窗口移动
map <LEADER>o <C-w>l
map <LEADER>u <C-w>k
map <LEADER>n <C-w>h
map <LEADER>e <C-w>j

" 分屏大小调整
map <up> :res +5<CR>
map <down> :res -5<CR>
map <left> :vertical resize-5<CR>
map <right> :vertical resize+5<CR>

" 分屏方向调整
map sv <C-w>t<C-w>H
map sh <C-w>t<C-w>K

" 标签
map tu :tabe<CR>
map tn :-tabnext<CR>
map to :+tabnext<CR>

" 打开文件自动定位到最后编辑的位置
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | execute "normal! g'\"" | endif

"" 主题
set termguicolors	" enable true colors support
let $NVIM_TUI_ENABLE_TRUE_COLOR=1
set background=dark

"" airline
let g:airline_theme="onedark"
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1

" nerdtree
noremap tt :NERDTreeToggle<CR>
let NERDTreeMapOpenExpl = ""
let NERDTreeMapUpdir = "N"
let NERDTreeMapUpdirKeepOpen = "n"
let NERDTreeMapOpenSplit = ""
let NERDTreeMapOpenVSplit = "O"
let NERDTreeMapActivateNode = "o"
let NERDTreeMapOpenInTabSilent = "O"
let NERDTreeMapPreview = ""
let NERDTreeMapCloseDir = ""
let NERDTreeMapChangeRoot = "l"
let NERDTreeMapMenu = ","
let NERDTreeMapToggleHidden = "zh"
let g:NERDTreeDirArrowExpandable='▷'
let g:NERDTreeDirArrowCollapsible='▼'


" nerdtree-git-plugin
let g:NERDTreeIndicatorMapCustom = {
    \ "Modified"  : "✹",
    \ "Staged"    : "✚",
    \ "Untracked" : "✭",
    \ "Renamed"   : "➜",
    \ "Unmerged"  : "═",
    \ "Deleted"   : "✖",
    \ "Dirty"     : "✗",
    \ "Clean"     : "✔︎",
    \ "Ignored"   : "☒'",
    \ "Unknown"   : "?"
    \ }

"" cpp-mode
"nnoremap <leader>y :CopyCode<cr>
"nnoremap <leader>p :PasteCode<cr>
"nnoremap <leader>U :GoToFunImpl<cr>
"nnoremap <silent> <leader>a :Switch<cr>
"nnoremap <leader><leader>fp :FormatFunParam<cr>
"nnoremap <leader><leader>if :FormatIf<cr>
"
"" change-colorscheme
"nnoremap <silent> <F9> :PreviousColorScheme<cr>
"inoremap <silent> <F9> <esc> :PreviousColorScheme<cr>
"nnoremap <silent> <F10> :NextColorScheme<cr>
"inoremap <silent> <F10> <esc> :NextColorScheme<cr>
"nnoremap <silent> <F11> :RandomColorScheme<cr>
"inoremap <silent> <F11> <esc> :RandomColorScheme<cr>
"nnoremap <silent> <F12> :ShowColorScheme<cr>
"inoremap <silent> <F12> <esc> :ShowColorScheme<cr>
"
"" prepare-code
"let g:prepare_code_plugin_path = expand($HOME . "/.vim/plugged/prepare-code")
"
"" vim-buffer
"nnoremap <silent> <c-p> :PreviousBuffer<cr>
"nnoremap <silent> <c-n> :NextBuffer<cr>
"nnoremap <silent> <leader>d :CloseBuffer<cr>
"nnoremap <silent> <leader>D :BufOnly<cr>
"
"" vim-edit
"nnoremap Y :CopyText<cr>
"nnoremap D :DeleteText<cr>
"nnoremap C :ChangeText<cr>
"nnoremap <leader>r :ReplaceTo<space>
"
"
"" YCM
"let g:ycm_confirm_extra_conf = 0 
"let g:ycm_error_symbol = '✗'
"let g:ycm_warning_symbol = '✹'
"let g:ycm_seed_identifiers_with_syntax = 1 
"let g:ycm_complete_in_comments = 1 
"let g:ycm_complete_in_strings = 1 
"let g:ycm_server_python_interpreter = '/usr/bin/python2.7'
"let g:ycm_collect_identifiers_from_tags_files = 1
"let g:ycm_semantic_triggers =  {
"  \   'c' : ['->', '.','re![_a-zA-z0-9]'],
"  \   'objc' : ['->', '.', 're!\[[_a-zA-Z]+\w*\s', 're!^\s*[^\W\d]\w*\s',
"  \             're!\[.*\]\s'],
"  \   'ocaml' : ['.', '#'],
"  \   'cpp,objcpp' : ['->', '.', '::','re![_a-zA-Z0-9]'],
"  \   'perl' : ['->'],
"  \   'php' : ['->', '::'],
"  \   'cs,java,javascript,typescript,d,python,perl6,scala,vb,elixir,go' : ['.'],
"  \   'ruby' : ['.', '::'],
"  \   'lua' : ['.', ':'],
"  \   'erlang' : [':'],
"  \ }
"nnoremap <leader>u :YcmCompleter GoToDeclaration<cr>
"" 已经使用cpp-mode插件提供的转到函数实现的功能
"" nnoremap <leader>i :YcmCompleter GoToDefinition<cr> 
"nnoremap <leader>o :YcmCompleter GoToInclude<cr>
"nnoremap <leader>ff :YcmCompleter FixIt<cr>
"nmap <F5> :YcmDiags<cr>
"
"" tagbar
"let g:tagbar_width = 30
"nnoremap <silent> <leader>t :TagbarToggle<cr>
"inoremap <silent> <leader>t <esc> :TagbarToggle<cr>
"
"" incsearch.vim
"map /  <Plug>(incsearch-forward)
"map ?  <Plug>(incsearch-backward)
"map g/ <Plug>(incsearch-stay)
"
"" markdown
"let uname = system('uname -s')
"if uname == "Darwin\n"
"    let g:mkdp_path_to_chrome = "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome"
"else
"    let g:mkdp_path_to_chrome = '/usr/bin/google-chrome-stable %U'
"endif
"nmap <silent> <F7> <Plug>MarkdownPreview
"imap <silent> <F7> <Plug>MarkdownPreview
"nmap <silent> <F8> <Plug>StopMarkdownPreview
"imap <silent> <F8> <Plug>StopMarkdownPreview
"
"" vim-easymotion
"let g:EasyMotion_smartcase = 1
"map <leader>w <Plug>(easymotion-bd-w)
"nmap <leader>w <Plug>(easymotion-overwin-w)
"
"
"" LeaderF
"nnoremap <leader>f :LeaderfFile ~<cr>
"let g:Lf_WildIgnore = {
"            \ 'dir': ['.svn','.git','.hg','.vscode','.wine','.deepinwine','.oh-my-zsh'],
"            \ 'file': ['*.sw?','~$*','*.bak','*.exe','*.o','*.so','*.py[co]']
"            \}
"let g:Lf_UseCache = 0
"
"" ack
"nnoremap <leader>F :Ack!<space>
"
"" echodoc.vim
"let g:echodoc_enable_at_startup = 1
"
"" tabular
"nnoremap <leader>l :Tab /\|<cr>
"nnoremap <leader>= :Tab /=<cr>
"
"" vim-smooth-scroll
"noremap <silent> <c-u> :call smooth_scroll#up(&scroll, 0, 2)<CR>
"noremap <silent> <c-d> :call smooth_scroll#down(&scroll, 0, 2)<CR>
"noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 0, 4)<CR>
"noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 0, 4)<CR>
"
